package com.uniflow.util;

import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.util.Base64;

/**
 * JWT密钥生成工具类
 * 用于生成符合HS512算法要求的安全密钥
 */
public class JwtKeyGenerator {
    
    /**
     * 生成符合HS512算法要求的安全密钥
     * @return Base64编码的密钥字符串
     */
    public static String generateSecureKey() {
        SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS512);
        return Base64.getEncoder().encodeToString(key.getEncoded());
    }
    
    /**
     * 验证密钥是否符合HS512算法要求
     * @param keyString 密钥字符串
     * @return 是否符合要求
     */
    public static boolean isValidHS512Key(String keyString) {
        try {
            byte[] keyBytes = keyString.getBytes("UTF-8");
            // HS512要求密钥长度至少512位（64字节）
            return keyBytes.length >= 64;
        } catch (Exception e) {
            return false;
        }
    }
    
    /**
     * 验证Base64编码的密钥是否符合HS512算法要求
     * @param base64Key Base64编码的密钥
     * @return 是否符合要求
     */
    public static boolean isValidBase64HS512Key(String base64Key) {
        try {
            byte[] keyBytes = Base64.getDecoder().decode(base64Key);
            // HS512要求密钥长度至少512位（64字节）
            return keyBytes.length >= 64;
        } catch (Exception e) {
            return false;
        }
    }
    
    /**
     * 生成指定长度的随机密钥字符串
     * @param length 密钥长度（字符数）
     * @return 随机密钥字符串
     */
    public static String generateRandomKey(int length) {
        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder key = new StringBuilder();
        for (int i = 0; i < length; i++) {
            key.append(chars.charAt((int) (Math.random() * chars.length())));
        }
        return key.toString();
    }
    
    /**
     * 主方法，用于生成JWT密钥
     */
    public static void main(String[] args) {
        System.out.println("=== JWT密钥生成工具 ===");
        
        // 方法1：使用JJWT推荐的方法生成密钥
        String secureKey = generateSecureKey();
        System.out.println("\n1. 使用JJWT推荐方法生成的Base64密钥:");
        System.out.println(secureKey);
        System.out.println("密钥长度: " + secureKey.length() + " 字符");
        System.out.println("是否符合HS512要求: " + isValidBase64HS512Key(secureKey));
        
        // 方法2：生成64字符的随机密钥
        String randomKey64 = generateRandomKey(64);
        System.out.println("\n2. 生成的64字符随机密钥:");
        System.out.println(randomKey64);
        System.out.println("密钥长度: " + randomKey64.length() + " 字符");
        System.out.println("是否符合HS512要求: " + isValidHS512Key(randomKey64));
        
        // 方法3：生成128字符的随机密钥（更安全）
        String randomKey128 = generateRandomKey(128);
        System.out.println("\n3. 生成的128字符随机密钥（推荐）:");
        System.out.println(randomKey128);
        System.out.println("密钥长度: " + randomKey128.length() + " 字符");
        System.out.println("是否符合HS512要求: " + isValidHS512Key(randomKey128));
        
        // 检查当前密钥
        String currentKey = "uniflow-platform-jwt-secret-key-2024";
        System.out.println("\n4. 当前密钥检查:");
        System.out.println("当前密钥: " + currentKey);
        System.out.println("密钥长度: " + currentKey.length() + " 字符");
        System.out.println("是否符合HS512要求: " + isValidHS512Key(currentKey));
        
        System.out.println("\n=== 建议 ===");
        System.out.println("请将上述任意一个符合要求的密钥复制到application.yml的app.jwt.secret配置中");
        System.out.println("推荐使用方法1生成的Base64密钥或方法3生成的128字符密钥");
    }
}